package com.excilys.formation.projet.ebanking.service.api;

import java.security.AccessControlException;
import java.util.List;

import org.joda.time.DateTime;

import com.excilys.formation.projet.ebanking.modele.Compte;
import com.excilys.formation.projet.ebanking.modele.Operation;
import com.excilys.formation.projet.ebanking.service.api.exception.SoldeInsuffisantException;

public interface IClientService {

	/**
	 * Récupère les comptes d'un client à partir de son identifiant
	 * 
	 * @param idClient identifiant de l'utilisateur connecté
	 * @return List<Compte> La liste des comptes de l'utilisateur
	 */
	List<Compte> getComptesByClient(int idClient) throws AccessControlException;

	/**
	 * Récupère la liste des opérations non carte d'un client suivant un mois
	 * donné et vérifie que le compte appartient bien à l'utilisateur d'id
	 * <tt>idClient</tt>. Dans le cas contraire une exception
	 * AccessControlException est jetée
	 * 
	 * @param idCompte L'identifiant en base du compte
	 * @param date Le mois courant des opérations
	 * @param idClient identifiant de l'utilisateur connecté
	 * @return List<Operation> La liste des opérations non carte du compte
	 * @throws AccessControlException si le compte n'appartient pas au client
	 *             d'id <tt>idClient</tt>
	 */
	List<Operation> getOperationsNonCarte(int idCompte, DateTime date, int idClient) throws AccessControlException;

	/**
	 * Récupère la liste des opérations carte d'un client suivant un mois donné
	 * et vérifie que le compte appartient bien à l'utilisateur d'id
	 * <tt>idClient</tt>. Dans le cas contraire une exception
	 * AccessControlException est jetée
	 * 
	 * @param idCompte L'identifiant en base du compte
	 * @param date Le mois courant des opérations
	 * @param idClient identifiant de l'utilisateur connecté
	 * @return List<Operation> La liste des opérations carte du compte
	 * @throws AccessControlException si le compte n'appartient pas au client
	 *             d'id <tt>idClient</tt>
	 */
	List<Operation> getOperationsCarte(int idCompte, DateTime date, int idClient) throws AccessControlException;

	/**
	 * Récupère la somme des opérations carte d'un compte pour un mois donné, et
	 * vérifie que le compte appartient bien à l'utilisateur d'id
	 * <tt>idClient</tt>. Dans le cas contraire une exception
	 * AccessControlException est jetée
	 * 
	 * @param idCompte L'identifiant en base du compte
	 * @param date Le mois courant des opérations
	 * @param idClient identifiant de l'utilisateur connecté
	 * @return Double La somme des opérations carte du mois
	 * @throws AccessControlException si le compte n'appartient pas au client
	 *             d'id <tt>idClient</tt>
	 */
	Double getSommeOperationsCarte(int idCompte, DateTime date, int idClient) throws AccessControlException;

	/**
	 * Effectue le virement de <tt>compteSource</tt> vers
	 * <tt>compteDestination</tt>.
	 * 
	 * Les deux comptes (<tt>compteSource</tt> et <tt>compteDestination</tt>)
	 * doivent être différents.
	 * 
	 * @param compteSource compte source. Ne doit pas être <tt>null</tt>.
	 * @param compteDestination compte destination. Ne doit pas être
	 *            <tt>null</tt>.
	 * @param montant montant à virer. Doit être supérieur à 0.
	 * @param date date du virement
	 * @throws SoldeInsuffisantException Si le compte source n'est pas
	 *             suffisamment approvisionné.
	 */
	void addVirementInterne(Compte compteSource, Compte compteDestination, double montant, DateTime date) throws SoldeInsuffisantException;
}
